from fdfs_client.client import Fdfs_client
from rest_framework import status
from rest_framework.generics import ListAPIView
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
from apps.goods.models import SKUImage, SKU
from apps.meiduo_admin.serializers.image import ImageSerializer, SimpleSKUSerializer
from apps.meiduo_admin.utils import PageNum


class ImageModelViewSet(ModelViewSet):
    # 　查询结果集
    queryset = SKUImage.objects.all()
    # 　序列号器
    serializer_class = ImageSerializer
    # 调用改写的分页
    pagination_class = PageNum

    # 新增图片
    def create(self, request, *args, **kwargs):
        """
        1.接收参数 （sku,image）
        2.创建Fdfs客户端
        3.上传图片二进制
        4.获取上传结果，并判断上传结果
        5.保存模型数据
        6.返回相应
        """
        # 1.接收参数 （sku,image）
        sku_id = request.data.get('sku')
        # 图片没有在 request.data
        upload_image = request.FILES.get('image')
        # 2.创建Fdfs客户端
        cli = Fdfs_client('utils/fastdfs/client.conf')
        # 3.上传图片二进制
        # upload_image.read() 调用文件的读方法 读文件就是读取的二进制
        # upload_by_buffer 是上传图片二进制
        result = cli.upload_appender_by_buffer(upload_image.read())

        # 4.获取上传结果，并判断上传结果
        """
        {'Uploaded size': '149.00KB',
         'Group name': 'group1',
         'Storage IP': '192.168.229.148',
         'Remote file_id': 'group1/M00/00/00/wKjllF5IoHGAHgORAAJUduk8mU48823845',
        'Status': 'Upload successed.',}
        """
        if result.get('Status') != 'Upload successed.':
            return Response(status=status.HTTP_403_FORBIDDEN)
            # return Response(status=403)
        file_id = result.get('Remote file_id')
        # 5.保存模型数据
        new_image = SKUImage.objects.create(sku_id=sku_id, image=file_id)
        # 6.返回相应
        # 必须返回一个 201
        # 因为前端就是通过 相应状态码 201来判断
        return Response({"id": new_image.id, 'sku': new_image.sku.id, 'image': file_id}, status=201)

    # 图片修改，可以在视图这里直接修改，但是代码量偏大，所以在序列化其中，重写部分方法，来实现代码
    # 像新增图片一样，重写视图集中的update方法也是没有问题的
    # def update(self, request, *args, **kwargs):
    #     pass


# 图片sku_id 获取
class SimpleSKUAPIVIew(ListAPIView):
    # 查询结果集
    queryset = SKU.objects.all()
    # 序列化器
    serializer_class = SimpleSKUSerializer
